Completed
Push — master ( 605e3d...3de0bb )
by Muhammad Dyas
14s queued 13s
created

TaskHandler   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 14
eloc 58
dl 0
loc 72
rs 10
c 0
b 0
f 0

4 Functions

Rating   Name   Duplication   Size   Complexity  
A remindAll 0 13 1
A getStateFromMessageId 0 13 5
B process 0 25 7
A updatePollMessage 0 10 1
1
import {PollState, TaskEvent} from '../helpers/interfaces';
2
import {callMessageApi} from '../helpers/api';
3
import {getStateFromCardName} from '../helpers/state';
4
import PollCard from '../cards/PollCard';
5
6
export default class TaskHandler {
7
  event: TaskEvent;
8
9
  public constructor(event: TaskEvent) {
10
    this.event = event;
11
  }
12
13
  async process(): Promise<void> {
14
    this.event.state = await this.getStateFromMessageId();
15
    switch (this.event.action) {
16
      case 'close_poll':
17
        if (this.event.state.closedBy) {
18
          console.log('the poll is already closed by ', this.event.state.closedBy);
19
          return;
20
        }
21
        if (!this.event.state.closedTime || this.event.state.closedTime > Date.now()) {
22
          this.event.state.closedTime = Date.now();
23
        }
24
        this.event.state.closedBy = 'scheduled auto-close';
25
        const apiResponse = await this.updatePollMessage(this.event.state);
26
        if (apiResponse?.status !== 200) {
27
          throw new Error('Error when closing message');
28
        }
29
        break;
30
      case 'remind_all':
31
        if (this.event.state.closedTime && this.event.state.closedTime > Date.now()) {
32
          await this.remindAll();
33
        }
34
        break;
35
      default:
36
        console.log('unknown task');
37
    }
38
  }
39
40
  async getStateFromMessageId(): Promise<PollState> {
41
    const request = {
42
      name: this.event.id,
43
    };
44
    const apiResponse = await callMessageApi('get', request);
45
    const currentState = getStateFromCardName(apiResponse.data!.cardsV2?.[0].card ?? {});
46
    if (!currentState) {
47
      throw new Error('State not found');
48
    }
49
    this.event.space = apiResponse.data!.space;
50
    this.event.thread = apiResponse.data!.thread;
51
    return JSON.parse(currentState) as PollState;
52
  }
53
54
  async updatePollMessage(currentState: PollState) {
55
    const localeTimezone = {locale: 'en', offset: 0, id: 'UTC'};
56
    const cardMessage = new PollCard(currentState, localeTimezone).createMessage();
57
    const request = {
58
      name: this.event.id,
59
      requestBody: cardMessage,
60
      updateMask: 'cardsV2',
61
    };
62
    return await callMessageApi('update', request);
63
  }
64
65
  async remindAll() {
66
    const text = `<users/all>, The poll with the topic *${this.event.state!.topic}*  is reaching its finale. Please wrap up your voting now.`;
67
68
    const request = {
69
      name: this.event.id,
70
      parent: this.event.space!.name,
71
      messageReplyOption: 'REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD',
72
      requestBody: {
73
        text, thread: this.event.thread,
74
      },
75
    };
76
    return await callMessageApi('create', request);
77
  }
78
}
79